package cn.hxsteel.jpart.pager;

import java.util.Map;
import java.util.TreeMap;

/**
 * 帮助分页的类
 * 
 * @since 2013.01.08
 * @author 林麒烽
 */
public class AjaxPager
{
    private int pageSize;
    private int pageNo;
    private int totalRecord;
    
    public AjaxPager( int pageNo, int pageSize, int totalSize )
    {
	this.pageSize = pageSize;
	this.pageNo = pageNo;
	this.totalRecord = totalSize;
    }
    
    /**
     * 创建当前页面的分页对象
     * 
     * @param showNo 要显示在分页组件上的数字个数，只可以是奇数
     */
    public PagerVO create( int showNo )
    {
	int totalPageNo = getTotalPageNo();
	if ( pageNo > totalPageNo ) pageNo = totalPageNo;
	
	PagerVO pagerVO = new PagerVO();
	pagerVO.setPageSize( pageSize );
	pagerVO.setTotalRecord( totalRecord );
	pagerVO.setCurrentPageNo( pageNo );
	pagerVO.setTotalPageNo( totalPageNo );
	pagerVO.setPageCode( givePageCodeList( showNo ) );
	
	return pagerVO;
    }
    
    /** 计算页码显示数组 */
    private Map< Integer, String > givePageCodeList( int showNo )
    {
	int totalPageNo = getTotalPageNo();
	// 分页显示数对半，若5就是2，7就是3
	int tag = ( showNo + 1 ) / 2;
	int showPageNo = totalPageNo > showNo ? showNo : totalPageNo;
	int[] shows = new int[ showPageNo ];
	
	for ( int i = 0; i < showPageNo; i++ )
	{
	    // 如果页码不足或者当前页码小于等于中轴数，就全部添加到列表
	    if ( totalPageNo <= showNo || pageNo <= tag )
	    {
		shows[i] = i + 1;
	    }
	    // 如果当前页码加中轴数大于总页数则总是添加末尾5个数字
	    else if ( pageNo + tag > totalPageNo )
	    {
		shows[i] = (int) ( totalPageNo - showNo + i + 1 );
	    }
	    // 其余都是当前页码显示在中轴数上
	    else
	    {
		shows[i] = (int) ( pageNo - tag + 1 + i );
	    }
	}
	
	Map< Integer, String > pageCodeMap = new TreeMap< Integer, String >();
	for ( int i = 0; i < showPageNo; i++ )
	{
	    pageCodeMap.put( i, String.valueOf( shows[i] ) );
	}
	return pageCodeMap;
    }
    
    /**
     * 取总页数.
     */
    private int getTotalPageNo()
    {
	if ( totalRecord % pageSize == 0 )
	    return (int) ( totalRecord / pageSize );
	else
	    return (int) ( totalRecord / pageSize + 1 );
    }
    
}
